package srcTest;

import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.NamingException;

import junit.framework.Assert;


import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.sumset.daos.CategoriaDao;
import com.sumset.daos.ComunidadDao;
import com.sumset.daos.PostDao;
import com.sumset.daos.UsuarioDao;
import com.sumset.entidades.Categoria;
import com.sumset.entidades.Post;
import com.sumset.entidades.Usuario;
import com.sumset.jpql.comentariosPostDTO;
import com.sumset.jpql.datosBasicosPostDTO;
import com.sun.xml.rpc.processor.modeler.j2ee.xml.string;

/**metodo que prueba los metodos del postDao
 * @author leyson FCP
 *
 */
public class PostTest {
	
	private static EJBContainer contenedor;
	private static PostDao pd;
	
	
	
	/**metodos que instancia todos los atributos y crea un post
	 * @throws Exception
	 */
	@BeforeClass
	public static void primerMetodo() throws Exception {
		Map<String, String> properties=new HashMap<String, String>();
		properties.put(EJBContainer.APP_NAME, "pratica_26");
		contenedor=EJBContainer.createEJBContainer(properties);
		pd=(PostDao) contenedor.getContext().lookup("java:global/pratica_26/PostDao");
		CategoriaDao cd=(CategoriaDao) contenedor.getContext().lookup("java:global/pratica_26/CategoriaDao");
		UsuarioDao ud=(UsuarioDao) contenedor.getContext().lookup("java:global/pratica_26/UsuarioDao"); 
		
		Post p=new Post();
		p.setId(1);
		p.setContenido("lllll");
		p.setTag("lllll");
		p.setNoGusta(0);
		p.setGusta(0); 
		p.setTitulo("llll");
		p.setFuente("lllll");
		p.setVisitas(0);
		p.setCategoria(cd.buscar(3));
		p.setUsuario(ud.buscar("prueba"));
		p.setComunidad(null);
		

		pd.insert(p);
		
	}
	/**metodo que prueba el insertar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void testInsert() throws Exception {
		CategoriaDao cd=(CategoriaDao) contenedor.getContext().lookup("java:global/pratica_26/CategoriaDao");
		UsuarioDao ud=(UsuarioDao) contenedor.getContext().lookup("java:global/pratica_26/UsuarioDao"); 
		
		Post p=new Post();
		p.setId(2);
		p.setContenido("lllll");
		p.setTag("lllll");
		p.setNoGusta(0);
		p.setGusta(0);
		p.setTitulo("llll");
		p.setFuente("lllll");
		p.setVisitas(0);
		p.setUsuario(ud.buscar("prueba"));
		p.setComunidad(null);
		p.setCategoria(cd.buscar(3));

		pd.insert(p);
		
		p=pd.buscar(2);
		
		Assert.assertEquals(2, p.getId().intValue());
		
		
	}

	
	/**metodo que prueba el actualizar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void testUpdate() throws Exception {
		Post p=pd.buscar(1);
		p.setTitulo("modificado");
		
		pd.update(p);
		
		p=pd.buscar(1);
		
		Assert.assertEquals("modificado", p.getTitulo());
	}
	/**metodo que prueba el eliminar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void testDelete() throws Exception {
		Post p=pd.buscar(2);
		
		pd.delete(p);
	    p=pd.buscar(2);
	
	    Assert.assertEquals(null, p);
	}
	/**metodo que prueba el buscar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void testBuscar() throws Exception {
		Post p=pd.buscar(1);
		
		Assert.assertEquals(1, p.getId().intValue());
	}
	/**metodo que prueba el listar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void testListar() throws Exception {
		List<Post> ps=pd.listar();
		Post p=pd.buscar(1);
		
		Assert.assertTrue(ps.contains(p));
	}
	
	
	/**metodo que prueba el resultlist de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void resultlist() throws Exception {
		
		List<Post> lista=pd.listarPostPorUsuarios("prueba");
		Post p=pd.buscar(3);
		Assert.assertTrue(lista.contains(p));
	}
	/**metodo que prueba el paginar de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void paginacion() {
		
		List<Post> lista=pd.listarPostPorUsuariosPaginado();		
		Assert.assertEquals(2, lista.size());
	}
	/**metodo que prueba el el primer resultado de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void firstResult() throws Exception {
		List<Post> lista=pd.listarPostConFirs();
		Post p=pd.buscar(2);
		Assert.assertFalse(lista.contains(p));
	}
	/**metodo que prueba el singleResult de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void singleeResult() {
		Usuario u=pd.usuarioPorPost(3);
		Assert.assertEquals("lukas", u.getNombre());
		
	}
	/**metodo que prueba el dto de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void consultaDTO() {
		datosBasicosPostDTO x=pd.consultaDTO(3);
		Assert.assertEquals("tres", x.getTituloPost());
		
	}
	/**metodo que prueba el join de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void provandoINJoin() {
		
		List<Post> ps=pd.postDeUsuarioIN("prueba");
		Assert.assertEquals(4, ps.size());
		
	}
	/**metodo que prueba el inerjoin de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void provandoINNERJoin() {
		
		List<Post> ps=pd.postDeUsuarioINNER("prueba");
		Assert.assertEquals(4, ps.size());
		
	}
	/**metodo que prueba el leftjoin de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void provandoLEFTJoin() {
		
		List<comentariosPostDTO> xs=pd.postDeUsuarioLEFT();
		Assert.assertEquals(6, xs.size());
		
	}
	/**metodo que prueba el left con distint de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void provandoLEFTJoinConDistinct() {
		
		List<comentariosPostDTO> xs=pd.postDeUsuarioLEFTConDistinc();
		Assert.assertEquals(5, xs.size());
		
	}
	/**metodo que prueba el group by de la clase postDao
	 * @throws Exception
	 */
	@Test
	public void groupBY() {
		List<Categoria> lista=pd.groupBY();
		Assert.assertEquals(2, lista.size());
	}
	
	/**
	 * metodo que elimina el rastro de la prueba
	 * @throws Exception
	 */
	@AfterClass
	public static void ultimoMetodo() throws Exception {
		Post p=pd.buscar(1);
		pd.delete(p);
	}

}
